package cn.whuc.scala.collections

object Case02_1 {
  def main(args: Array[String]): Unit = {
    val datas: List[(String, String, String)] = List(
      ("zhangsan", "湖北", "鞋"),
      ("lisi", "湖北", "衣服"),
      ("wangwu", "湖北", "鞋"),
      ("zhangsan", "湖南", "鞋"),
      ("lisi", "湖南", "衣服"),
      ("wangwu", "湖南", "鞋"),
      ("zhangsan", "湖南", "鞋"),
      ("lisi", "湖北", "衣服"),
      ("wangwu", "湖北", "鞋"),
      ("zhangsan", "湖北", "鞋"),
      ("lisi", "湖北", "衣服"),
      ("wangwu", "湖北", "帽子"),
      ("zhangsan", "湖南", "鞋"),
      ("lisi", "湖南", "衣服"),
      ("wangwu", "湖南", "帽子"),
      ("zhangsan", "湖南", "鞋"),
      ("lisi", "湖北", "衣服"),
      ("wangwu", "湖北", "帽子"),
      ("lisi", "湖北", "衣服"),
      ("wangwu", "湖北", "电脑"),
      ("zhangsan", "湖南", "鞋"),
      ("lisi", "湖南", "衣服"),
      ("wangwu", "湖南", "电脑"),
      ("zhangsan", "湖南", "电脑"),
      ("lisi", "湖北", "衣服"),
      ("wangwu", "湖北", "帽子")
    )
    // 省份  -  商品 点击排行
    // 1 同一省份 同一商品 计数 1
    val data1: List[((String, String), Int)] = datas.map((t) => {
      ((t._2, t._3), 1)
    })
    println(data1)
    // 2 统计 reduceByKey 能不能使用？ 不行，所以要使用groupBY
    val data2: Map[(String, String), List[((String, String), Int)]] = data1.groupBy((t) => {
      t._1
    })
    println(data2)
    // 3 通过分组得到的统一省份商品的1的集合的长度 计算同一省份商品的计数
    val data3: List[((String, String), Int)] = data2.map((kv) => {
      (kv._1, kv._2.size)
    }).toList
    println(data3)
    // 4 (省份 商品) 计数  ==> 省份 (商品 计数)
    // 因为需要按省份 进行分组统计 需要注意的时 拆份之后 map集合 key是会重复的
    // 所以 data3 从map转换到list
    val data4: List[(String, (String, Int))] = data3.map(t => {
      (t._1._1, (t._1._2, t._2))
    })
    println(data4)

    // 5 按省份分组
    val data5: Map[String, List[(String, (String, Int))]] = data4.groupBy(t => {
      t._1
    })
    println(data5)

    // 6 变换 排序
    val data6: Map[String, List[(String, Int)]] = data5.map(t => {
      (t._1, t._2.map(t => {
        (t._2)
      }).sortBy(t=>{
        t._2
      })(Ordering.Int.reverse))
    })

    println(data6)

  }
}
